package utils;
	
import java.awt.Dimension;
import java.io.File;
	
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Hashtable;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.text.DefaultCaret;

import org.farng.mp3.MP3File;
import org.farng.mp3.id3.ID3v1;
import org.farng.mp3.id3.ID3v2_2;
import org.farng.mp3.id3.ID3v2_3;
import org.farng.mp3.id3.ID3v2_4;
	
import entidades.Disco;
import entidades.Grupo;
import entidades.Tema;
import gestores.Sistema;
	
public class CreadorBD {

	private static JTextArea directoriosLeidos;
	private static JProgressBar barraProgreso;
	private static JFrame ventanaProgreso;
	private static JPanel panelProgreso;
	
	private static Hashtable<String, Integer> grupoId;
	private static Hashtable<String, Integer> discoId;
	private static Hashtable<String, Integer> temaId;

	private static Vector<Tema> listaTemas;
	private static Vector<Grupo> listaGrupos;
	private static Vector<Disco> listaDiscos;
		
	private static String directorio;
		
	private static Integer gruposContador;
	private static Integer discosContador;
	private static Integer temasContador;
		
	private static String grupoAnterior;
	private static String discoAnterior;
	
	
	private static void procesarTags(String input) {
		
		//System.out.println(input);
		
		if ((input.endsWith(".mp3")) || (input.endsWith(".wma")) || (input.endsWith(".ogg"))) {

			String grupo = null;
			String disco = null;
			String tema = null;
		
			try {
				File sourceFile = new File(input);
				MP3File mp3file = new MP3File(sourceFile);
				    
				if (mp3file.hasID3v1Tag()) {
					ID3v1 tagV1 = mp3file.getID3v1Tag();
						
					try {
						grupo =  tagV1.getArtist();
					}
					catch (java.lang.NullPointerException e) {
						grupo = " ";
						//e.printStackTrace();
					}
						
					try {
						disco = tagV1.getAlbum();
					}
					catch (java.lang.NullPointerException e) {
						disco = " ";
						//e.printStackTrace();
					}

					try {
						tema = tagV1.getTitle();
					}
					catch (java.lang.NullPointerException e) {
						tema = null;
						//e.printStackTrace();
					}
						
	  	        		
					//System.out.println("Version 1   " + tema + " - " + tema.length() + " ------- " + grupo + " - " + grupo.length() + " ------ " + disco + " - " + disco.length());
				}
				else {
					boolean v24 = false;
					boolean v23 = false;
					ID3v2_4 tagV24 = new ID3v2_4();
					ID3v2_3 tagV23 = new ID3v2_3();
					ID3v2_2 tagV22 = new ID3v2_2(); 
					
					if (mp3file.getID3v2Tag() instanceof ID3v2_4) {
						v24 = true;
						tagV24 = (ID3v2_4) mp3file.getID3v2Tag();
					}
					else
					if (mp3file.getID3v2Tag() instanceof ID3v2_3) {
						v23 = true;
						tagV23 = (ID3v2_3) mp3file.getID3v2Tag();
					}
					else {
						tagV22 = (ID3v2_2) mp3file.getID3v2Tag();
					}
						
						
					if (v24) {
						try {
							grupo =  tagV24.getLeadArtist();
						}
						catch (java.lang.NullPointerException e) {
							grupo = " ";
							//e.printStackTrace();
						}
							
						try {
							disco = tagV24.getAlbumTitle();
						}
						catch (java.lang.NullPointerException e) {
							disco = " ";
							//e.printStackTrace();
						}
							
						try {
							tema = tagV24.getSongTitle();
						}
						catch (java.lang.NullPointerException e) {
							tema = null;
							//e.printStackTrace();
						}
					}
					else 
					if (v23) {
						try {
							grupo =  tagV23.getLeadArtist();
						}
						catch (java.lang.NullPointerException e) {
							grupo = " ";
							//e.printStackTrace();
						}
								
						try {
							disco = tagV23.getAlbumTitle();
						}
						catch (java.lang.NullPointerException e) {
							disco = " ";
							//e.printStackTrace();
						}
								
						try {
							tema = tagV23.getSongTitle();
						}
						catch (java.lang.NullPointerException e) {
							tema = null;
							//e.printStackTrace();
						}
					}
					else {
						try {
							grupo =  tagV22.getLeadArtist();
						}
						catch (java.lang.NullPointerException e) {
							grupo = " ";
							//e.printStackTrace();
						}
								
						try {
							disco = tagV22.getAlbumTitle();
						}
						catch (java.lang.NullPointerException e) {
							disco = " ";
							//e.printStackTrace();
						}
								
						try {
							tema = tagV22.getSongTitle();
						}
						catch (java.lang.NullPointerException e) {
							tema = null;
							//e.printStackTrace();
						}
					}
					//System.out.println("Version 2   "  + tema + " - "  + " ------- " + grupo + " - " + grupo.length() + " ------ " + disco + " - " + disco.length());
				}
				    
				if (tema != null)
					if ((tema.startsWith("       ")) || (tema.length() == 0))
						tema = null;
		  	        	
		  	   	Grupo grupoNuevo = null;
		  	   	Disco discoNuevo = null;
		  	        	
		  	   	boolean nuevo = false;
		  	   	grupo = limpiarString(grupo.toUpperCase());
		  	        	
		  	   	if (grupo != grupoAnterior) {
		  	   		if (!grupoId.containsKey(grupo)) { 
			  	   		//System.out.println("Nuevo Grupo");
		  	   			grupoId.put(grupo, gruposContador);
		  	   			grupoNuevo = new Grupo(grupo, gruposContador);
		  	   			
		  	   			listaGrupos.add(grupoNuevo);
		  	   			
		  	   			gruposContador++;
		  	   			grupoAnterior = grupo;
		  	   			nuevo = true;
		  	        }
		  	   	}
		  	        	
		  	   	if (!nuevo) {
		  	   		grupoNuevo = new Grupo(grupo, grupoId.get(grupo));
		  	   	}
		  	        		
		  	   	nuevo = false;
		  	   	disco = limpiarString(disco.toUpperCase());
			        	
		  	   	if (disco != discoAnterior) {
		  	   		if (!discoId.containsKey(disco)) { 
			  	   		//System.out.println("Nuevo Disco");
		  	   			discoId.put(disco, discosContador);
		  	   			discoNuevo = new Disco(discosContador, disco, grupoNuevo.getId());
		  	   			
		  	   			listaDiscos.add(discoNuevo);
		  	   			
		  	   			discosContador++;
		  	   			discoAnterior = disco;
		  	   			nuevo = true;
		  	        }
		  	   	}
		  	        	
		  	   	if (!nuevo) {
		  	   		discoNuevo = new Disco(discoId.get(disco), disco, grupoNuevo.getId());
		  	   	}
		  	        	

		  	   	if (!temaId.containsKey(input)) {
		  	   		//System.out.println("Nuevo tema");
			  	   	if (tema == null) {
			  	   		String[] ruta = input.split("/");
			  	   		String nombreTema = ruta[ruta.length - 1];
			  	   		tema = limpiarString(nombreTema.toUpperCase());
			  	        		
			  	   		tema = tema.replace(".MP3", " ").replace(".WMA", " ").replace(".OGG", " ");
			  	   		
			  	   		listaTemas.add(new Tema(grupoNuevo.getId(), discoNuevo.getId(), input, tema, temasContador));
			  	   		temaId.put(input, temasContador);
			  	   		temasContador++;
			  	   	}
			  	   	else {
			  	   		tema = limpiarString(tema.toUpperCase());
			  	   		
			  	   		listaTemas.add(new Tema(grupoNuevo.getId(), discoNuevo.getId(), input, tema, temasContador));
			  	   		temaId.put(input, temasContador);
			  	   		temasContador++;
			  	   	}
		  	   	}
		  	   	//System.out.println(tema + " ------- " + grupo + " ------ " + disco);
			}    
			catch (Exception e) {
				//System.out.println("No es un archivo de audio");
			}
		}
	}
			
			
	public static void cargarDB (boolean agregando) throws IOException {
		
		@SuppressWarnings("unused")
		Thread hiloVentana = new Thread() {
			public void run() {
				ventanaProgreso = new JFrame();
				panelProgreso = new JPanel();

				Border paneEdge = BorderFactory.createEmptyBorder(20,20,20,20);
				panelProgreso.setBorder(paneEdge);
				panelProgreso.setLayout(new BoxLayout(panelProgreso, BoxLayout.Y_AXIS));
				barraProgreso = new JProgressBar();
				barraProgreso.setIndeterminate(true);
				panelProgreso.add(barraProgreso);
				
				JPanel panelVacio = new JPanel();
				panelVacio.setPreferredSize(new Dimension(10,10));
				panelProgreso.add(panelVacio);
				
				directoriosLeidos = new JTextArea("Leyendo Directorios:");
				DefaultCaret caret = (DefaultCaret)directoriosLeidos.getCaret();
				caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

				JScrollPane scrollPane = new JScrollPane(directoriosLeidos);
				scrollPane.setPreferredSize(new Dimension(400,70));
				scrollPane.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
				scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
				scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
				panelProgreso.add(scrollPane);
				ventanaProgreso.setContentPane(panelProgreso);
				
				
				ventanaProgreso.setResizable(false);
				ventanaProgreso.setTitle("Creando Base de Datos - Puede tardar unos minutos!");
				ventanaProgreso.pack();
				ventanaProgreso.setLocationRelativeTo(null);
				ventanaProgreso.setVisible(true);
				ventanaProgreso.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			}
		};
		
		JFileChooser fileChooser = new JFileChooser();
		fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		fileChooser.setMultiSelectionEnabled(true);
		File[] directorios;
		//Aca tengo que poner la ventana padre
		fileChooser.setDialogTitle("Elija la carpeta de musica a cargar");
		int seleccion = fileChooser.showDialog(null, "Cargar");
				
		if (seleccion == JFileChooser.APPROVE_OPTION) {
			//directorio = fileChooser.getSelectedFile().getAbsolutePath();
			directorios = fileChooser.getSelectedFiles();

			grupoId = new Hashtable<String, Integer>();
			discoId = new Hashtable<String, Integer>();
			temaId = new Hashtable<String, Integer>();

			listaTemas = new Vector<Tema>();
			listaGrupos = new Vector<Grupo>();
			listaDiscos = new Vector<Disco>();
			
			if (!agregando) {
				gruposContador = 1;
				discosContador = 1;
				temasContador = 1;
				
				grupoId.put(" ", 1);
				gruposContador++;
				listaGrupos.add(new Grupo(" ", 1));
				discoId.put(" ", 1);
				listaDiscos.add(new Disco(1, " ", 1));
				discosContador++;
				
				grupoAnterior = " ";
				discoAnterior = " ";
				Sistema.crearBaseDatos();
			}
			else {
				gruposContador = Sistema.getIdUltimoGrupo() + 1;
				discosContador = Sistema.getIdUltimoDisco() + 1;
				temasContador = Sistema.getIdUltimoTema() + 1;
				
				grupoId = Sistema.gruposYaCargados();
				discoId = Sistema.discosYaCargados();
				temaId = Sistema.temasYaCargados();
				
				grupoAnterior = "-1";
				discoAnterior = "-1";
			}
			
			//hiloVentana.start();
			//hiloVentana.notify();
			//hiloVentana.run();
			
			for (int i = 0; i < directorios.length; i++) {
				directorio = new String(directorios[i].getAbsolutePath());
				String[] temp = {"bash","-c","find "+"\""+directorio+"\""};	
				java.io.InputStream is;

				is = Runtime.getRuntime().exec(temp).getInputStream();
				BufferedReader br = new BufferedReader (new InputStreamReader (is));
									
				br.readLine();
									
				while(br.ready()) {
					procesarTags(br.readLine());
				}
			}
			
			Sistema.cargarGrupos(listaGrupos);
			Sistema.cargarDiscos(listaDiscos);
			Sistema.cargarTemas(listaTemas);
			//ventanaProgreso.dispose();
		}
		JOptionPane.showMessageDialog(null, "La base de datos ha sido creada con exito!", "Informacion", JOptionPane.INFORMATION_MESSAGE);;
	}
			
			
/*	private static void iniciarVentana() {
		ventanaProgreso = new JFrame();
		panelProgreso = new JPanel();

		Border paneEdge = BorderFactory.createEmptyBorder(20,20,20,20);
		panelProgreso.setBorder(paneEdge);
		panelProgreso.setLayout(new BoxLayout(panelProgreso, BoxLayout.Y_AXIS));
		barraProgreso = new JProgressBar();
		barraProgreso.setIndeterminate(true);
		panelProgreso.add(barraProgreso);
		
		JPanel panelVacio = new JPanel();
		panelVacio.setPreferredSize(new Dimension(10,10));
		panelProgreso.add(panelVacio);
		
		directoriosLeidos = new JTextArea("Leyendo Directorios:");
		DefaultCaret caret = (DefaultCaret)directoriosLeidos.getCaret();
		caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

		JScrollPane scrollPane = new JScrollPane(directoriosLeidos);
		scrollPane.setPreferredSize(new Dimension(400,70));
		scrollPane.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
		scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		panelProgreso.add(scrollPane);
		ventanaProgreso.setContentPane(panelProgreso);
		
		
		ventanaProgreso.setResizable(false);
		ventanaProgreso.setTitle("Creando Base de Datos - Puede tardar unos minutos!");
		ventanaProgreso.pack();
		ventanaProgreso.setLocationRelativeTo(null);
		ventanaProgreso.setVisible(true);
		ventanaProgreso.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}*/


	private static String limpiarString(String nombre) {
		return nombre.replace("�"," ").replace("_", " ").replace("-", " ").replace("Ñ", "N").replace("Á", "A").replace("É", "E").replace("Í", "I").replace("Ó", "O").replace("Ú", "U");
	}
}
	

	
